/****************************************************************************
 **
 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
 ** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the examples of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:BSD$
 ** You may use this file under the terms of the BSD license as follows:
 **
 ** "Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
 ** met:
 **   * Redistributions of source code must retain the above copyright
 **     notice, this list of conditions and the following disclaimer.
 **   * Redistributions in binary form must reproduce the above copyright
 **     notice, this list of conditions and the following disclaimer in
 **     the documentation and/or other materials provided with the
 **     distribution.
 **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
 **     of its contributors may be used to endorse or promote products derived
 **     from this software without specific prior written permission.
 **
 **
 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 **
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

#ifndef HIGHLIGHTER_H
#define HIGHLIGHTER_H

#include <QSyntaxHighlighter>
#include <QHash>
#include <QTextCharFormat>
#include <QVector>
#include <QColor>
#include <QStringList>
#include <QRegularExpression>

class QTextDocument;

class Highlighter : public QSyntaxHighlighter
{
    Q_OBJECT

public:

    Highlighter(QString filetype, QString theme, QTextDocument *parent = 0);
    // 高亮主题
    void setTheme(QString filetype, QString theme);

protected:
    // 需要高亮的文件块->高亮逻辑
    void highlightBlock(const QString &text);

private:
    // 设置高亮器
    void setupHighlighter(QString fileType, QString theme);
    // 主题颜色
    void setColorValues(QString theme);
    // 不同语言的规则
    void setCompiledLanguageRules();
    void setScriptingLanguageRules();
    void setMarkupLanguageRules();
    void setAsmRules();
    void setCssRules();
    void setSqlRules();

    struct HighlightingRule
    {
        //QRegExp pattern;
        QRegularExpression pattern;
        QTextCharFormat format;
    };
    QVector<HighlightingRule> highlightingRules;

    //QRegExp commentStartExpression;
    //QRegExp commentEndExpression;
    // 多行注释
    QRegularExpression commentStartExpression;
    QRegularExpression commentEndExpression;

    QTextCharFormat keywordFormat;              // 关键字
    QTextCharFormat numberFormat;               // 数字
    QTextCharFormat singleLineCommentFormat;    // 单行注释
    QTextCharFormat multiLineCommentFormat;     // 多行注释
    QTextCharFormat quotationFormat;            // 字符串
    QTextCharFormat functionFormat;             // 函数名
    QTextCharFormat formatStringFormat;         // 格式化字符串
    QTextCharFormat operatorFormat;             // 操作符
    QTextCharFormat phpVarFormat;               // PHP
    QTextCharFormat rubyVarFormat;              // Ruby
    QTextCharFormat tagFormat;                  // HTML
    QTextCharFormat valueFormat;                // 属性
    QTextCharFormat attributeFormat;            // HTML属性
    QTextCharFormat idFormat;                   // CSS ID
    QTextCharFormat classFormat;                // CSS类
    // 语言分类
    QStringList compiledLanguages;
    QStringList scriptingLanguages;
    QStringList markupLanguages;
    // 主题颜色
    QColor keywordColor;
    QColor keyword2Color;
    QColor functionsColor;
    QColor valueColor;
    QColor numColor;
    QColor operatorColor;
    QColor formatStringColor;
    QColor commentColor;
    QColor varColor;
    QColor tagColor;
    QColor htmlAttributesColor;
    QColor cssClassesIDsColor;
    QColor cssAttributesColor;
};

#endif // HIGHLIGHTER_H
